﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Web.UI.WebControls;

    public class ManejoCSV
    {
        #region Variables de Instancia
        private string _ubicacion;
        private Queue<string> _cola;
        private FileStream _fs;
        private StreamReader _sr;
        private static DataTable _dt;

        public static DataTable DT
        {
            get { return _dt; }
            set { _dt = value; }
        }

        public string Ubicacion
        {
            get { return _ubicacion; }
            set { _ubicacion = value; }
        }
        #endregion

        /// <summary>
        /// Constructor recibe ubicacion y crea objetos de flujo de datos para manejar informacion de archivo .CSV
        /// </summary>
        /// <param name="u">Directorio del archivo .CSV</param>
        public ManejoCSV(FileUpload _fu)
        {
            string virtualFolder = "~/Recursos/";
            string physicalFolder = System.Web.HttpContext.Current.Server.MapPath(virtualFolder);


            _fu.SaveAs(physicalFolder + _fu.FileName);

            Ubicacion = physicalFolder + _fu.FileName;
            _fs = new FileStream(Ubicacion, FileMode.Open, FileAccess.Read);
            _sr = new StreamReader(_fs);
            DT = new DataTable();
        }

        public ManejoCSV() { }

        /// <summary>
        /// Toma la informacion del archivo .CSV y lee linea por linea al mismo tiempo acumulando en una cola los valores del horario.
        /// </summary>
        /// <returns></returns>
        public bool LeerArchivo()
        {
            //DD
            _cola = new Queue<string>();
            //FUNC

            while (!_sr.EndOfStream)
            {
                _cola.Enqueue(_sr.ReadLine());
            }
            return _cola.Count >= 1 ? this.FormatoColumnasHorario() : false;
        }

        public bool LeerArchivo2()
        {
            //DD
            string virtualFolder = "~/Recursos/";
            string physicalFolder = System.Web.HttpContext.Current.Server.MapPath(virtualFolder);
            Ubicacion = physicalFolder + "Ejemplo_Horario.csv";
            _fs = new FileStream(Ubicacion, FileMode.Open, FileAccess.Read);
            _sr = new StreamReader(_fs);
            DT = new DataTable();
            _cola = new Queue<string>();
            //FUNC

            while (!_sr.EndOfStream)
            {
                _cola.Enqueue(_sr.ReadLine());
            }
            return _cola.Count >= 1 ? this.FormatoColumnasHorario() : false;
        }
        /// <summary>
        /// Ya teniendo los valores de las columnas de Horario
        /// </summary>
        /// <returns></returns>
        private bool FormatoColumnasHorario()
        {
            //DD
            string _cadena = _cola.Dequeue(); //Saca de cola, valores de columna ( son los primeros)
            DataColumn _dc;
            int _index;
            //FUNC

            //COLUMNAS
            while (_cadena.Length >= 1){
                _index = _cadena.IndexOf(','); //Busca el indice de la primera coma que encuentre
                if (_cadena.Contains(',')){
                    _dc = new DataColumn(_cadena.Substring(0, _index)); //Obtiene la cadena con el rango de indices dados (empieza en 0 y termina en el indice de la primera coma encontrada
                    _cadena = _cadena.Remove(0, _index + 1); //Elimina el texto, desde el indice 0 hasta el indice de la primera coma encontrada + 1
                }
                else {
                    _dc = new DataColumn(_cadena.Substring(0, _cadena.Length)); //Realiza lo mismo de arriba pero esto en caso de que no encuentre una coma (para la columna final)
                    _cadena = _cadena.Remove(0, _cadena.Length);
                }
                DT.Columns.Add(_dc);// Agrega la columna al DataTable
            }
            return DT.Columns.Count > 0 ? this.FormatoFilasHorario() : false;
        }

        private bool FormatoFilasHorario()
        { 
            
            //DD
            string _cadena = "";
            string[] _array = new string[6];
            int _registros = _cola.Count,_index,x=0;

            for (int z = 0; z < _registros; z++) {
                x = 0;
                _cadena = _cola.Dequeue();
                while (_cadena.Length >= 1)
                {
                    _index = _cadena.IndexOf(','); //Busca el indice de la primera coma que encuentre
                    if (_cadena.Contains(','))
                    {
                        _array[x] = (_cadena.Substring(0, _index)); //Obtiene la cadena con el rango de indices dados (empieza en 0 y termina en el indice de la primera coma encontrada
                        _cadena = _cadena.Remove(0, _index + 1); //Elimina el texto, desde el indice 0 hasta el indice de la primera coma encontrada + 1
                    }
                    else
                    {
                        _array[x] = (_cadena.Substring(0, _cadena.Length)); //Realiza lo mismo de arriba pero esto en caso de que no encuentre una coma (para la columna final)
                        _cadena = _cadena.Remove(0, _cadena.Length);
                    }
                    x++;
                }
                //add new row DT
                DT.Rows.Add(_array);
            }

            return DT.Rows.Count > 0 ? true : false;
        }

        public bool GuardarHorario()
        {
            return false;
        }


    }
